package com.party.orders.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.alipay.api.AlipayApiException;
import com.party.alipay.AlipayRefundVO;
import com.party.alipay.MyAlipayUtils;
import com.party.domain.User;
import com.party.dto.Response;
import com.party.orders.service.OrdersService;
import com.party.tool.OrdersNumUtils;
/**
 * 
 * @author Caizhf
 * @date 2017年6月13日下午4:19:08
 * @version v.0.1
 * @email 1115054416@qq.com 
 *
 * <p>Description: 订单控制器</p>
 *
 */
@RequestMapping("/orders")
@RestController
public class OrdersController {
	
	@Autowired
	private OrdersService ordersService;
	
	
	/**
	 * 功能：删除订单
	 * @param spid 
	 * @return
	 */
	//测试地址：127.0.0.1:8090/orders/delete/*
	@RequestMapping("/delete/{spid}")
	public Response delete(@PathVariable("spid") int spid){
		ordersService.delete(spid);
		return Response.success();
	}
	
	/**
	 * 功能：按状态查询某个用户的所有订单
	 * @param ordersState 状态号
	 * @param pageNum	页码
	 * @param userId	用户
	 * @return 包装类型对象的集合
	 */
	//测试地址：127.0.0.1:8090/orders/list/user/*?ordersState=*&pageSize=*&userId=*
	@RequestMapping("/list/user/{pageNum}")
	public Response listByUser(@RequestParam("ordersState") int ordersState,
			@PathVariable int pageNum,@RequestParam("pageSize") int pageSize,@RequestParam("userId") int userId){
		return Response.success(ordersService.listOrdersByUser(userId, ordersState, pageNum, pageSize));
	}
	
	/**
	 * 功能：按状态查询所有的订单
	 * @param ordersState
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	//测试地址：127.0.0.1:8090/orders/list/*?ordersState=*&pageSize=*
	@RequestMapping("/list/{pageNum}")
	public Response list(@RequestParam("ordersState") int ordersState,
			@PathVariable int pageNum,@RequestParam("pageSize") int pageSize){
		return Response.success(ordersService.listOrders(ordersState, pageNum, pageSize));
	}
	
	/**
	 * 功能：显示单个订单的详情
	 * @param spid
	 * @return
	 */
	//测试地址：127.0.0.1:8080/orders/get/*
	@RequestMapping("/get/{spid}")
	public Response get(@PathVariable int spid){
		return Response.success(ordersService.findById(spid));
	}
	
	/**
	 * 功能：在后台取消订单
	 * @param spid
	 * @return
	 */
	//测试地址127.0.0.1:8090/orders/calloff?spid=*
	@RequestMapping("/calloff")
	public Response callOffOrders(@RequestParam("spid") int spid){
		ordersService.updateOnStateToCanceled(spid);
		return Response.success();
	}
	
	/**
	 * 功能：按订单号查询订单
	 * @param ordersNum
	 * @return
	 */
	//测试地址：127.0.0.1:8090/orders/get?ordersNum=*
	@RequestMapping("/get")
	public Response get(@RequestParam("ordersNum")String ordersNum){
		return Response.success(ordersService.findByOrdersNum(ordersNum));
	}
	
	
	/**
	 * 功能：支付接口等等各种接口都需要调用这个接口修改状态
	 * 请注意：这是一个非常危险的方法，有用户可能会恶意修改订单状态而访问这个接口（上线的时候这个接口有待注释）
	 * 条件以及跳转的关系：
	 * 		如果支付失败：传入1
	 * 		如果支付成功并且有预约服务：传入2
	 * 		如果预约的服务全部成功：传入3
	 * 		如果支付成功并且没有预约服务：传入3
	 * 		如果订单已经完成：传入4
	 * 		如果正在退款中：传入5
	 * 		如果已经退款：传入6
	 * 		如果已经取消订单：传入7
	 * @param state 1~7
	 * @return
	 */
	//测试地址:127.0.0.1:8080/orders/update?state=*&spid=*
	@RequestMapping("/update")
	public Response updateOnState(@RequestParam("state") int state,@RequestParam("spid") int spid){
		ordersService.updateOnState(state,spid);
		return Response.success();
	}
	
	/**
	 * 已经过时，保留做测试接口。请转到RefundController查看退款业务详情
	 * 
	 * 支持post方法
	 * @param out_trade_no   	本商户订单号(与支付宝流水号必须有其一,不能两者为空)
	 * @param trade_no			支付宝流水单号
	 * @param refund_amount		退款金额（不得大于原金额）
	 * @param refund_reason		退款原因
	 * @return
	 * @throws AlipayApiException
	 */
	/*@Deprecated
	@RequestMapping(value="/refund")
	@Transactional	//由于考虑通用性，本方法事务必须放在这一层
	public Response aliPayRefund(String out_trade_no, String trade_no,String refund_amount,String refund_reason) throws AlipayApiException{

		//考虑一个问题：如果退款成功，业务操作却执行异常，如何解决（是否支持夸服务器事务处理）？
		//先执行退款操作
		AlipayRefundVO refundVo = MyAlipayUtils.refund(out_trade_no, trade_no, "899898949494", refund_amount, refund_reason);
		System.out.println(refundVo.toString());
		//执行退款后的业务操作
		if(null!=refundVo&&null!=refundVo.getAlipay_trade_refund_response()){
			
		}
		return Response.success();
	}*/
}
